import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
import { User } from '@/types/user'
import { getUserInfo } from '@/api/user'

export const useGlobalStore = defineStore('global', () => {
  // 搜索对话框状态
  const showSearchDialog = ref(false)

  // 主题状态
  const theme = ref<'light' | 'dark'>('light')

  // 侧边栏状态
  const sidebarVisible = ref(true)

  // 移动端菜单状态
  const mobileMenuOpen = ref(false)

  // 加载状态
  const loading = ref(false)

  // 用户信息加载状态
  const userLoading = ref(false)

  // 用户信息
  const user = ref<User>()

  // 计算头像URL
  const avatarUrl = computed(() =>
    user.value?.avatar ? '/api/portal/file/' + user.value.avatar : ''
  )

  // 网站统计（计算属性，从user数据获取）
  const siteStats = computed(() => ({
    totalPosts: user.value?.blogCount || 0,
    totalViews: user.value?.visitCount || 0,
    totalComments: user.value?.commentCount || 0,
    runningDays: user.value?.runningDays || 0,
    buildTime: user.value?.createTime || '', //建站时间
  }))

  // 计算属性
  const isDark = computed(() => theme.value === 'dark')

  // 用户信息加载Promise缓存（仅在加载中存在）
  let userInfoPromise: Promise<User | null> | null = null

  // 方法
  const toggleTheme = () => {
    theme.value = theme.value === 'light' ? 'dark' : 'light'
    // 保存到localStorage
    localStorage.setItem('blog-theme', theme.value)
  }

  const toggleSidebar = () => {
    sidebarVisible.value = !sidebarVisible.value
  }

  const toggleMobileMenu = () => {
    mobileMenuOpen.value = !mobileMenuOpen.value
  }

  const setLoading = (state: boolean) => {
    loading.value = state
  }

  const handleSetUser = (val: User) => {
    user.value = val
  }

  // 初始化用户信息
  const initUserInfo = async () => {
    // 如果已经有用户信息或正在加载中，则不重复加载
    if (user.value || userLoading.value) {
      return user.value
    }

    try {
      userLoading.value = true
      const userData = await getUserInfo({})
      user.value = userData
      return userData
    } catch (error) {
      console.error('获取用户信息失败:', error)
      return null
    } finally {
      userLoading.value = false
    }
  }

  // 确保用户信息已加载（如果没有则加载）
  const ensureUserInfo = async () => {
    if (user.value) {
      // 已有用户信息，直接返回
      return user.value
    }
    if (userInfoPromise) {
      // 如果有正在进行的Promise，直接等待
      return await userInfoPromise
    }
    // 没有用户信息且没有正在加载，发起加载并缓存Promise
    userInfoPromise = (async () => {
      try {
        const result = await initUserInfo()
        return result ?? null // 保证不会返回undefined
      } finally {
        userInfoPromise = null
      }
    })()
    return await userInfoPromise
  }

  // 初始化主题
  const initTheme = () => {
    const savedTheme = localStorage.getItem('blog-theme') as 'light' | 'dark'
    if (savedTheme) {
      theme.value = savedTheme
    } else {
      // 检测系统主题偏好
      const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches
      theme.value = prefersDark ? 'dark' : 'light'
    }
  }

  return {
    // 状态
    showSearchDialog,
    theme,
    sidebarVisible,
    mobileMenuOpen,
    loading,
    userLoading,
    // user, // 禁止外部直接访问user，统一通过ensureUserInfo获取

    // 计算属性
    avatarUrl,
    siteStats,
    isDark,

    // 方法
    toggleTheme,
    toggleSidebar,
    toggleMobileMenu,
    setLoading,
    handleSetUser,
    initUserInfo,
    ensureUserInfo,
    initTheme,
  }
})
